Semantik Web • Hafta 05
OWL İleri Konular & Protégé
Restriction'lar, cardinality, karmaşık sınıf tanımları, Protégé'de önemli noktalar ve OWL API ile ilk Java adımları
Lisansüstü Semantik Web Dersi • CMPE 583
Hafta 05 • Kazanımlar
Bu hafta sonunda
- someValuesFrom / allValuesFrom / hasValue kısıtlarını doğru yerde kullanabileceksiniz.
- Cardinality ve kapanış aksiyomlarıyla "güvenli ürün" gibi tanımlar yazabileceksiniz.
- Protégé'de kısıt girme, reasoner çalıştırma ve gerekçe okuma işlerini yapabileceksiniz.
- Güncel sürüm/uyumluluk tablosunu kullanarak ortamı doğru kurabileceksiniz.
- OWL API ile ontolojiyi yükleyip aksiyom ekleyebileceksiniz.
01
Ödev 4'ün Çözümü
Tanımlı sınıf, çıkarım kanıtı ve çelişki analizi.
Çözüm 4.1 — LactoseRiskPerson
LactoseRiskPerson
EquivalentTo
Person
and (hasAllergy value Lactose)
and (ChooseProduct some
(Contain some
(Triggers value Lactose)))
Üyeler: TC_001 (Nisin)
TC_002 (Casein)
TC_003 (Casein)
S6+S7'nin yerini tutmaz: hangi katkının suçlu olduğunu (Effected_Allergen) üretmez, yalnızca sınıflandırır.
Çözüm 4.2 — Çelişkinin gerekçesi
Explanation for: Nothing SubClassOf TC_009
1) TC_009 Type Person
2) TC_009 Contain Nisin
3) Contain Domain Product
4) Person DisjointWith Product
Dört satır, hatanın tam zinciridir. Explain ekranını okumak, ontoloji hata ayıklamanın en önemli becerisidir: reasoner size sadece "tutarsız" demez, hangi aksiyomlar yüzünden olduğunu söyler.
02
Restriction'lar
Anonim sınıflar: some, only, value, cardinality.
Kısıt: adı olmayan bir sınıf
<owl:Restriction>
<owl:onProperty rdf:resource="#Contain"/>
<owl:someValuesFrom
rdf:resource="#FoodAdditives"/>
</owl:Restriction>
- Bu ifade "en az bir katkı içeren şeyler" kümesidir.
- Adı yoktur; blank node olarak yazılır.
- Bir sınıfa subClassOf veya equivalentClass ile bağlanır.
someValuesFrom — "en az bir"
RiskyProduct EquivalentTo
Product and (Contain some (Triggers some Allergy))
Okunuşu: en az bir katkı içeriyor ve o katkı en az bir alerji tetikliyor.
EAN_00004 → RiskyProduct ✓
(Nisin → Lactose)
EAN_00001 → RiskyProduct ✓
(Alginic_Acid → Gluten)
allValuesFrom — "yalnızca"
VeganProduct SubClassOf
Product and (Contain only PlantBasedAdditive)
Okunuşu: içerdiği bütün katkılar bitkisel kökenli olmalı.
Tuzak: hiç katkısı bildirilmemiş bir ürün de bu kısıtı sağlar — "hepsi" boş kümede doğrudur.
some ile only farkı
| Durum | Contain some Allergen | Contain only Allergen |
| Bir alerjen + bir nötr katkı | Doğru | Yanlış |
| Sadece nötr katkılar | Yanlış | Yanlış |
| Hiç katkı bildirilmemiş | Yanlış | Doğru |
Risk modellemesinde some kullanılır: pozitif kanıt arar. Güvenlik iddiası için only gerekir ve mutlaka kapanış aksiyomu ile birlikte kullanılmalıdır.
hasValue — belirli bir bireye bağlanmak
LactoseIntolerantPerson
EquivalentTo
Person and
(hasAllergy value Lactose)
LactoseTrigger
EquivalentTo
FoodAdditives and
(Triggers value Lactose)
Üyeler: Nisin, Casein
value bireye, some sınıfa bağlanır. Karıştırmak, boş sınıfların en yaygın nedenidir.
Cardinality: min, max, exactly
| Manchester | Anlamı | Alerji örneği |
| min 1 Contain | En az bir | Her ürün en az bir katkı içerir |
| max 0 Contain | Hiç yok | Katkısız ürün |
| exactly 1 hasBarcode | Tam bir | Tek barkod |
| min 2 Contain FoodAdditives | Nitelikli (OWL 2) | Çok katkılı ürün |
Nitelikli sayı kısıtı OWL 2 ile geldi: sayı ile birlikte tür de belirtilir.
Sayı kısıtı çıkarım üretir
MultiAdditiveProduct
EquivalentTo
Product and
(Contain min 2 FoodAdditives)
EAN_00002 ✓ (2 katkı)
EAN_00003 ✓ (2 katkı)
EAN_00004 ✓ (3 katkı)
EAN_00001 ✗ (1 katkı)
Dikkat: sayım için bireylerin farklı olduğu bilinmelidir. Tekil isim varsayımı olmadığı için gerekirse AllDifferent bildirilir.
Kapanış aksiyomu: "başka katkı yok"
EAN_00003 Type
Contain only {Casein, Sodium_Ascorbite}
Bu bildirim olmadan açık dünya "başka katkılar da olabilir" der ve hiçbir güvenlik iddiası çıkarılamaz.
Pratik: etiketi tam okunmuş ürünlere kapanış aksiyomu ekleyin; kısmi okunanlara eklemeyin.
"Laktoz için güvenli ürün" tanımı
LactoseSafeProduct EquivalentTo
Product and
(Contain only (not (Triggers value Lactose)))
| Ürün | Kapanış var mı | Sonuç |
| EAN_00001 | Evet | Güvenli (Alginic_Acid → Gluten) |
| EAN_00003 | Evet | Güvenli değil (Casein) |
| EAN_00004 | Hayır | Karar verilemez |
Gerekli mi, gerekli ve yeterli mi?
SubClassOf — gerekli
PersonAtRisk ⊑ Person
Riskli kişi kişidir; ama kişinin riskli olduğu çıkarılmaz.
EquivalentTo — gerekli ve yeterli
RiskyProduct ≡ Product ⊓ ∃Contain…
Koşulu sağlayan her ürün sınıfa otomatik girer.
Projede PersonAtRisk bilinçli olarak subClassOf'tur: üyeliği SWRL kuralı üretir, böylece hangi kuralın sorumlu olduğu izlenebilir.
Sayılan sınıf (oneOf) ve ayrık birleşim
Allergy EquivalentTo
{Lactose, Egg, Fish, Gluten}
Person DisjointUnionOf
Adult, Minor
İlk aksiyom alerji listesini kapatır: yeni bir alerji eklemek artık modeli değiştirmek anlamına gelir. Bu bilinçli bir karardır — projede kapatmadık.
HasKey: barkod ürünü belirler
HasKey(Product () (hasBarcode))
:P1 :hasBarcode "8690504" .
:P2 :hasBarcode "8690504" .
→ :P1 owl:sameAs :P2
Farklı kataloglardan gelen iki kayıt aynı barkodu taşıyorsa reasoner bunları tek ürün olarak birleştirir. Veri bütünleştirmenin en zarif yolu.
Veri aralığı kısıtı: BMI sınıfları
ObesePerson EquivalentTo
Person and
(hasBMI some double[>= 30.0])
NormalWeightPerson EquivalentTo
Person and
(hasBMI some
double[>= 18.5 , < 25.0])
S4 kuralı sonrası:
TC_001 23.92 → Normal
TC_002 28.26 → Fazla kilolu
TC_003 26.60 → Fazla kilolu
TC_004 33.43 → Obez
Kural aritmetiği üretir, OWL sınıflandırır: iki teknolojinin doğru iş bölümü budur.
Negatif özellik bildirimi
NegativeObjectPropertyAssertion(
:Contain :EAN_00001 :Nisin )
Açık dünyada "içermiyor" bilgisini açıkça yazmanın yolu. Laboratuvar testi ile doğrulanmış yokluk için kullanılır; test edilmemiş yokluk için kullanılmamalıdır.
03
Protégé: Önemli Noktalar
Kısıt girme, reasoner, gerekçe, DL Query ve sürümler.
Kısıt nasıl girilir?
EntitiesIndividuals by classSWRLTab
Class: RiskyProduct › Equivalent To › [+]
Product and (Contain some (Triggers some Allergy))
Class expression editor · Ctrl+Space = otomatik tamamlama
OKCancel
Şematik gösterim. Söz dizimi hatası varsa editör kırmızı çerçeve gösterir ve OK düğmesi devre dışı kalır.
Reasoner çalıştıktan sonra ne görürsünüz?
Reasoner › HermiT 1.4.5 › Start reasoner • Synchronise
Inferred class hierarchy
▾ Product
RiskyProduct (inferred)
▾ Person
PersonAtRisk (inferred)
Explanation for: EAN_00004 Type RiskyProduct
1) EAN_00004 Contain Nisin
2) Nisin Triggers Lactose
3) Lactose Type Allergy
4) RiskyProduct EquivalentTo …
Sarı zeminli satırlar çıkarımdır; dosyaya yazılmazlar. Kalıcı istiyorsanız sonraki slayta bakın.
Çıkarımı dosyaya yazmak
| Yol | Nerede | Not |
| Export inferred axioms | File → Export inferred axioms as ontology | Hangi tür aksiyomların yazılacağı seçilir |
| Programatik | InferredOntologyGenerator | Projede ADIM 8'de kullanılıyor |
| SWRL motoru | Drools → OWL | Kural çıktısını asserted yazar |
Bu ayrım sınavda sorulur: çıkarım geçicidir, materialization kalıcıdır. Projede ikisini de yapıyoruz.
DL Query: sınıf ifadesiyle sorgulama
EntitiesDL QuerySPARQL Query
Person and (hasAllergy value Lactose)
☑ Instances ☐ Subclasses ☑ Direct only
TC_001, TC_002, TC_003
DL Query, ontolojiyi bozmadan hipotez denemenin en hızlı yoludur; sınıf yazmadan sonucu görürsünüz.
Ontology metrics: sağlık kontrolü
Metrics — ALLERGY_FIXED.owl
Axiom 118
Logical axiom 93
Class count 6
Object property 9
Data property 6
Individual 17
SWRL rule 7
- Mantıksal aksiyom sayısı, modelin gerçek büyüklüğüdür.
- Sınıf sayısı çok, aksiyom sayısı az ise: taksonomi var, mantık yok.
- DL ifadesi (SROIQ) panelde görünür; profil kontrolü için kullanın.
Sık karşılaşılan tutarsızlık kaynakları
| Neden | Belirti | Çözüm |
| Ayrık sınıflara aynı birey | Nothing altında birey | Tip bildirimini düzelt |
| Functional özelliğe iki değer | Tutarsız ontoloji | Değeri tekilleştir |
| max 0 kısıtı + bildirim | Boş sınıf çelişkisi | Kısıtı gevşet |
| Yanlış range + literal tipi | Datatype çelişkisi | xsd tipini eşitle |
| Kural çıktısı ile kısıt çakışması | infer() sonrası tutarsız | Kuralı DL-safe yap |
Güncel sürümler ve uyumluluk
| Bileşen | Sürüm | Not |
| Protégé Desktop | 5.6.x | Java 11 ile paketli dağıtımlar mevcut |
| OWL API | 4.5.x / 5.x | Protégé 5.6 → 4.5 dalı |
| HermiT | 1.4.5 | OWL API 4 ve 5 yapıları ayrı |
| Pellet / Openllet | Openllet 2.6.x | Pellet'in sürdürülen çatalı |
| SWRLAPI + Drools | 2.x | OWL API 4 ile uyumlu |
| JDK | 8 veya 11 | SWRLAPI için 8 en güvenli |
Kural: SWRLAPI hangi OWL API dalını istiyorsa bütün projeyi o dala sabitleyin. Karışık sürüm en sık görülen kurulum hatasıdır.
Kurmanız gereken eklentiler
| Eklenti | İşi | Projede |
| SWRLTab / SWRLAPI | Kural yazma ve çalıştırma | Zorunlu (Hafta 07) |
| SQWRLTab | Kural üstü sorgu | Zorunlu (Hafta 10) |
| HermiT / Openllet | Reasoner | Zorunlu |
| OntoGraf | Graf görselleştirme | Önerilir |
| Cellfie | Excel'den birey üretme | Büyük katalog için |
Kurulum: File → Check for plugins; kurulumdan sonra Protégé yeniden başlatılmalıdır.
04
Java'ya İlk Adım
OWL API ile yükleme, okuma, aksiyom ekleme — yavaş yavaş.
Adım 0 — pom.xml bağımlılıkları
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlapi-distribution</artifactId>
<version>4.5.29</version>
</dependency>
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>org.semanticweb.hermit</artifactId>
<version>1.4.5.519</version>
</dependency>
SWRL API bağımlılıklarını Hafta 08'de ekleyeceğiz; şimdilik ontolojiyi okuyup yazmaya odaklanıyoruz.
Adım 1 — Ontolojiyi yükle
OWLOntologyManager man = OWLManager.createOWLOntologyManager();
OWLDataFactory df = man.getOWLDataFactory();
OWLOntology ont = man.loadOntologyFromOntologyDocument(
new File("ALLERGY_FIXED.owl"));
System.out.println("Aksiyom sayisi: " + ont.getAxiomCount());
Üç nesne: manager dosya işlerini, data factory yeni varlık üretmeyi, ontology aksiyomları tutar. Projedeki Main.java ADIM 1 aynısını yapar.
Adım 2 — Sınıf ve bireyleri listele
for (OWLClass c : ont.getClassesInSignature())
System.out.println(c.getIRI().getShortForm());
OWLClass person = df.getOWLClass(
IRI.create(NS + "Person"));
EntitySearcher.getIndividuals(person, ont)
.forEach(i -> System.out.println(
" " + i.getIRI().getShortForm()));
Person
Product
FoodAdditives
Allergy
Adult
PersonAtRisk
TC_001
TC_002
TC_003
TC_004
Adım 3 — Kısıt aksiyomu ekle
OWLClass product = df.getOWLClass(IRI.create(NS + "Product"));
OWLClass additives = df.getOWLClass(IRI.create(NS + "FoodAdditives"));
OWLObjectProperty contain =
df.getOWLObjectProperty(IRI.create(NS + "Contain"));
// Product ⊑ ∃Contain.FoodAdditives
OWLClassExpression expr =
df.getOWLObjectSomeValuesFrom(contain, additives);
man.addAxiom(ont, df.getOWLSubClassOfAxiom(product, expr));
Protégé'de tek satırda yazdığınız kısıt, API'de üç nesne olarak kurulur: özellik, sınıf, ifade.
Adım 4 — Sayı kısıtı ve ayrıklık
// Contain min 2 FoodAdditives
OWLClassExpression min2 =
df.getOWLObjectMinCardinality(2, contain, additives);
man.addAxiom(ont, df.getOWLEquivalentClassesAxiom(
df.getOWLClass(IRI.create(NS + "MultiAdditiveProduct")),
df.getOWLObjectIntersectionOf(product, min2)));
// Person ⊓ Product = ∅
man.addAxiom(ont, df.getOWLDisjointClassesAxiom(
df.getOWLClass(IRI.create(NS + "Person")), product));
Adım 5 — HermiT ile denetle
OWLReasonerFactory rf = new org.semanticweb.HermiT.ReasonerFactory();
OWLReasoner hermit = rf.createReasoner(ont);
System.out.println("Tutarli mi? " + hermit.isConsistent());
OWLClass risky = df.getOWLClass(IRI.create(NS + "MultiAdditiveProduct"));
hermit.getInstances(risky, false).getFlattened()
.forEach(i -> System.out.println(" " + i.getIRI().getShortForm()));
hermit.dispose();
Tutarli mi? true
EAN_00002 EAN_00003 EAN_00004
Adım 6 — Diske yaz
File out = new File("ALLERGY_STEP5.owl");
man.saveOntology(ont, new RDFXMLDocumentFormat(),
IRI.create(out.toURI()));
System.out.println("Yazildi: " + out.getAbsolutePath());
| Format sınıfı | Çıktı |
| RDFXMLDocumentFormat | RDF/XML (projede) |
| TurtleDocumentFormat | Turtle |
| FunctionalSyntaxDocumentFormat | Functional |
05
Ödev ve Proje Adımı
Kısıtlarla zenginleşen ontoloji ve ilk Java çalıştırması.
Ödev 5 — Kısıtlar ve ilk Java kodu
- Ontolojinize üç kısıt ekleyin: biri some, biri only, biri sayı kısıtı.
- Bir "güvenli" sınıfı kapanış aksiyomu ile tanımlayın.
- Reasoner çıkarımını explain ekranıyla belgeleyin.
- Maven projesi kurup ontolojiyi Java'dan yükleyin, envanteri yazdırın.
- Java ile bir kısıt aksiyomu ekleyip dosyayı yeniden kaydedin.
Teslim
.owl + Maven projesi + konsol çıktısı ekran görüntüsü + 3 sayfa rapor.
Çözümü Hafta 06'nın başında ele alacağız.
Değerlendirme ölçütleri
| Ölçüt | Ağırlık | Beklenen |
| Kısıt doğruluğu | 30% | some/only/sayı yerinde kullanılmış |
| Kapanış aksiyomu | 20% | Güvenlik iddiası gerekçeli |
| Explain analizi | 15% | Aksiyom zinciri okunmuş |
| Java kurulumu | 20% | Proje derleniyor, çalışıyor |
| Aksiyom ekleme | 15% | Dosyada görülebiliyor |
Kaynaklar
- W3C — OWL 2 Primer, kısıtlar ve sayı kısıtları bölümleri.
- Horridge, M. — A Practical Guide To Building OWL Ontologies Using Protégé 5.
- OWL API belgeleri ve örnek kod deposu (owlcs/owlapi).
- HermiT ve Openllet proje sayfaları — sürüm notları.
- Stanford BMIR — Protégé eklenti kataloğu.
Özet • 1 / 2
Kısıtlar
- some pozitif kanıt arar; risk modellemesinin dili.
- only güvenlik iddiası kurar; kapanış aksiyomu olmadan işe yaramaz.
- Sayı kısıtları bireylerin farklılığı bilinmedikçe sayamaz.
- EquivalentTo üyelik üretir, SubClassOf üretmez.
Özet • 2 / 2
Protégé, sürümler ve Java
- Explain ekranı hata ayıklamanın merkezidir.
- Çıkarım geçici, materialization kalıcıdır.
- Sürümleri SWRLAPI'nin istediği OWL API dalına sabitleyin.
- OWL API: manager, data factory, ontology üçlüsü.
Hafta 06'da
OWL-S: semantik web servisleri, Profile / Process Model / Grounding ve öneri servisinin tanımı.
Ayrıca: Ödev 5'in ayrıntılı çözümü.
Tekrar Soruları
Kendinizi sınayın
- Katkısı bildirilmemiş ürün neden only kısıtını sağlar?
- Kapanış aksiyomu hangi varsayımı yerel olarak kapatır?
- min 2 kısıtı neden AllDifferent isteyebilir?
- hasValue ile some arasındaki fark nedir?
- Explain ekranındaki dört satır ne anlatır?
- Export inferred axioms ile Drools → OWL farkı nedir?
- HasKey iki kaydı nasıl birleştirir?
- Neden bütün proje tek OWL API dalına sabitlenmeli?
Alıştırma • Sınıf içi
Güvenli ürünü çıkarılabilir yap
EAN_00001 yalnızca Alginic_Acid içeriyor. Bu ürünün laktoz için güvenli olduğu çıkarılabilsin.
EAN_00001 Type
Contain only { ______ }
LactoseSafeProduct EquivalentTo
Product and
(Contain only (not ______))
Sorular
- Kapanış aksiyomu olmadan sonuç ne olurdu?
- EAN_00004 için aynı iddia neden yazılamaz?
- Bu tanım hangi hasta profilinden bağımsızdır?
Çözüm Hafta 06'da.